#include <iostream>
using namespace std;

typedef struct Node{
    int data;
    struct Node* next;
} Node, *LinkList;

void InitLinkList(LinkList *linkList) {
    (*linkList) = (LinkList)malloc(sizeof(Node));
    (*linkList)->next = NULL;
}

void InsertHead(LinkList *linkList,int data) {
    LinkList newNode = (LinkList)malloc(sizeof(Node));
    newNode->data = data;

    LinkList oldContent = (*linkList)->next;
    (*linkList)->next = newNode;
    newNode->next = oldContent;
}

void InsertTail(LinkList *linkList,int data) {
    LinkList NewNode = (LinkList)malloc(sizeof(Node));
    NewNode->data = data;
    NewNode->next = NULL;

    LinkList Cursor = (*linkList)->next;
    if (Cursor == NULL) {
        (*linkList)->next = NewNode;
    } else {
        for (;;) {
            if (Cursor->next == NULL) {
                Cursor->next = NewNode;
                return;
            }
            Cursor = Cursor->next;
        }
    }



}

bool InsertIndex(LinkList *linkList,int index,int data) {
    LinkList cursor,temp;
    cursor = (*linkList)->next;
    for (int j = 0; j < index; ++j) {
        cursor = cursor->next;
        if (!cursor) {
            return false;
        }
    }
    LinkList newNode = (LinkList)malloc(sizeof(Node));
    newNode->data = data;
    temp = cursor->next;
    cursor->next = newNode;
    newNode->next = temp;
    return true;

}

void SearchData(LinkList linkList,int data) {
    LinkList cursor;
    cursor = linkList->next;
    int index = 0;
    while (cursor) {
        if (cursor->data == data) {
            printf("%d的位置是%d\n",data,index);
            return;
        }
        cursor = cursor->next;
        index++;
    }
    printf("未找到元素%d\n",data);
}

void PrintList(LinkList linkList) {
    LinkList cursor;
    cursor = linkList->next;
    while (cursor) {
        printf("%d",cursor->data);
        cursor = cursor->next;
    }
}


int main() {
    LinkList linkList;
    InitLinkList(&linkList);
    //InsertHead(&linkList,1);
    //PrintList(linkList);
    InsertTail(&linkList,77);
    InsertTail(&linkList,78);
    PrintList(linkList);

}

/*
 * http://note.youdao.com/noteshare?id=a7f4d1feb855e31225a121a111086f1c
 *
 * 1,其实这个LinkList就是头指针，指向第一个头节点，注意在第9行处使用了二级指针，是因为我们需要修改34行指针的值，修改指针的值
 * 必须传入指针的地址，指针的地址就是二级指针了。在InitLinkList里面我们初始化了一个Node指针类型的值并在第10行赋值给头指针，
 * 可以想象，如果不是二级指针的话，复制不了的。
 *
 * 2,在InsertHead的地址，我们也需要修改头指针的next域指向一个新的节点地址，所以我们也必须传入一个头指针的地址，也就是二级
 * 指针。这个地方可以想象为动车头，动车头永远是不装乘客的（司机不在考虑范围内），所以其实头结点的data是空，next就好比是动车头
 * 的牵引钩子，用来牵引后面拖着的车厢，我们每次加入一个元素的话就是把原来的老的内容暂存，然后把新节点地址赋值给车头，然后新节点
 * 的next牵引钩再保持老内容。
 */



